/**
 * <p>SystemName: WLBSNS</p>
 * <P>FileName: ConnectionPool.java</P>
 * <p>Description: 微乐帮社交网络 </p> 
 * <p>Copyright: Copyright (c) 2013 </p> 
 * <p>Company: </p> 
 * @author Theron 
 * @date 2013年11月10日 下午4:53:14 
 * @version V1.0 
 */
package com.wlbsns.framework.db;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.LinkedList;

import com.wlbsns.framework.exception.SystemException;


/**
 * 
 * <p>FileName: ConnectionPool.java </p>
 * <p>PackageName: com.wlbsns.framework.db </p>
 * <p>ClassName: ConnectionPool </p>
 * <p>Desciption: 数据库连接池 </p>
 * @author Theron
 * @date 2013年11月10日 下午5:19:35
 */
class ConnectionPool {
	
	private static String driverName = "com.mysql.jdbc.Driver";
	private static String url = "jdbc:mysql://127.0.0.1:3306/wlbsns";
	private static String username = "root";
	private static String password = "root";

	LinkedList<Connection> connectionPool = null;//使用链表存放连接对象
	int initCount = 5;//初始化时创建的个数
	int maxCount = 10;//为避免对数据库访问的速度影响，所以当连接池中没有连接时不能无限制的创建
	int currentCount = 0;
	
	static{	
		try {
			//加载驱动程序
			Class.forName(driverName);
			
		} catch (ClassNotFoundException e) {
			throw new SystemException("数据库驱动程序加载失败，请检查驱动程序。");
		}
	}
	
	/**
	 * 构造函数用于初始化创建连接
	 */
	ConnectionPool() {
		
			//实例化链表集合
			connectionPool = new LinkedList<Connection>();
			
			// 循环创建initCount个连接
			for (int i = 0; i < initCount; i++) {
				connectionPool.addLast(this.createConnection());
				currentCount++;//当前连接个数
			}
	}
	
	/**
	 * 
	 * <p>FileName: ConnectionPool.java</p>
	 * <p>Function:  </p>
	 * <p>Description: 获取链接对象 </p>
	 * @date 2013年11月10日 下午5:19:57
	 * @author Theron
	 * @return
	 * @throws SystemException
	 * <p>ReturnType: Connection</p>
	 */
	Connection getConnection() throws SystemException {
		
		//多线程同步
		synchronized (connectionPool) {
			if(this.connectionPool.size()>0){
				return this.connectionPool.removeFirst();//從連接池中取出一个连接
			}
			if(currentCount<maxCount){
				currentCount++;
				return this.createConnection();
			}
			throw new SystemException("连接池中没有连接了，请等待。");
		}
	}
	
	/**
	 * 
	 * <p>FileName: ConnectionPool.java</p>
	 * <p>Function: 创建链接 </p>
	 * <p>Description:  </p>
	 * @date 2013年11月10日 下午5:20:14
	 * @author Theron
	 * @return
	 * @throws SystemException
	 * <p>ReturnType: Connection</p>
	 */
	private Connection createConnection() throws SystemException{
		
		Connection conn = null;
		try {
			conn =  DriverManager.getConnection(url, username, password);
		} catch (SQLException e) {
			e.printStackTrace();
			throw new SystemException(e.getMessage());
		}
		return conn;
	}
}
